–––––––––––––––––– Science is what we understand well enough to explain to a computer. Art is everything else we do. ––––––––––––––––––Donald Knuth
|
|
Principe de conception
|
|
|
Principe de conception
|
|
|
Principe de conception
|
|
|
Design pattern : Stratégie (Strategy)
Stratégie définit une famille d’algorithmes, encapsule chacun d’eux et les rend interchangeables. Il permet à l’algorithme de varier indépendamment des clients qui l’utilisent. |
|
|
Cet exemple est tiré de ce cours. |
Le problème
Vous avez une classe FileWriter qui a pour rôle d’écrire dans un fichier
ainsi qu’une classe DBWriter. Dans un premier temps, ces classes ne
contiennent qu’une méthode write() qui n’écrira que le texte passé
en paramètre.
Au fil du temps, vous vous rendez compte que c’est dommage qu’elles ne fassent que ça et vous aimeriez bien qu’elles puissent écrire en différents formats (HTML, XML, etc.) : les classes doivent donc formater puis écrire.
La solution
|
|
L’interface en
PHP (code source ici)
|
|
|
La classe abstraite
Writer (code source ici)
|
|
|
La classe
FileWriter (code source ici)
|
|
|
La classe
DBWriter (code source ici)
|
Enfin, nous avons nos trois formateurs.
L’un ne fait rien de particulier (TextFormater),
et les deux autres formatent le texte en deux langages
différents (HTMLFormater et XMLFormater).
|
|
La classe
TextFormater (code source ici)
|
|
|
La classe
HTMLFormater (code source ici)
|
|
|
La classe
XMLFormater (code source ici)
|
La fonction standard sort() de python
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
Stratégie de cryptage en fonction de la taille d’un fichier
File file = getFile();
Cipher c = CipherFactory.getCipher( file.size() );
c.performAction();
// implementations:
interface Cipher {
public void performAction();
}
class InMemoryCipherStrategy implements Cipher {
public void performAction() {
// load in byte[] ....
}
}
class SwaptToDiskCipher implements Cipher {
public void performAction() {
// swapt partial results to file.
}
}
|
|
Plus de détails ici |
|
|
Les patrons ne sont pas réutilisables! |
Il faut implémeter la solution qu’il représente à chaque fois.
Exception : certains font l’objet d’une librairie.
Par exemple le patron Singleton existe dans la bibliothèque standard du langage en Ruby. C’est un mixin qu’il suffit d’inclure dans la classe qui doit être un singleton.
class Klass
include Singleton
# ...
end
a,b = Klass.instance, Klass.instance
a == b
# => true
Klass.new
# => NoMethodError - new is private ...
Alexander : patterns pour les architectures (les vraies)
Beck et Cunningham : patterns pour des interfaces utilisateurs
Meyer : livre sur l’orienté objet (langage Eiffel), devenu la bible pour beaucoup de programmeurs (cf. [Meyer88])
Gamma, Helm, Johnson et Vlissides : LE livre de référence (cf. [GoF]) NOTE: Les patterns de ce livre sont connus comme les Gof pour « Gang of Four ».
Martin : principes SOLID (cf. [Martin03])
Craig Larman décrit des modèles de conception : les Patterns GRASP (cf. [Larman05])
SOLID:
Responsabilité => Sujet à changement
Ouvert à l'extension mais fermé à la modification
|
|
Une fois écrite et testée, une classe ne devrait être modifiée que pour être corrigée! Toute modification devrait être possible par extension. |
Une classe doit pouvoir être remplacée par une instance d'un de ses sous-types, sans modifier la cohérence du programme
Un carré est un rectangle a deux côtés égaux.
|
|
Peut-on toujours substituer un Carré à la place d’un Rectangle ?
|
Préférer plusieurs interfaces spécifiques pour chaque client plutôt qu'une seule interface générale
Il faut dépendre des abstractions, pas des implémentations
Ce principe indique :
|
|
Ainsi ce principe va à l’encontre de l’intuition classique. |
|
|
QUESTION
Lesquels des 5 principes SOLID s’appliquent bien à Strategy ? |
Quelques éléments de réponses :
Bof
⇒ Oui : extension (du comportement) sans toucher au code!
Non
Oui, mais pas spécifiquement
⇒ Oui : les algos dépendent des mêmes abstractions que les données (les interfaces)
The critical design tool for software development is a mind well educated in design principles. It is not the UML or any other technology.
Craig Larman, 2005
Il s’agit d’un ensemble de patrons, plutôt orientés conception (UML). Nous en aborderons certains au travers des exemples de ce module (cf. [Larman05]).
T’as qu’à utiliser une factory!
|
|
QUESTION
Qui fait la nuit de l’info dans un groupe avec des Masters? |
Exemple de Strategy :
Strategy
Situations où il est nécessaire de permuter dynamiquement les algorithmes utilisés
Définir une famille d’algorithmes, encapsuler chacun d’eux en tant qu’objet, et les rendre interchangeables.
Ce patron laisse les algorithmes changer indépendamment des clients qui les emploient.
Ceux déjà pratiqués
Les "pressentis"
Les nouveaux
Les "avancés"
Ceux qu’on n’aura pas le temps d’aborder
Concepts avancés
|
|
QUESTION
|
|
|
Ces définitions seront enrichies au fur et à mesure des patrons étudiés. |
Observateur définit une relation entre objets de type un-à-plusieurs, de façon que, lorsqu’un objet change d’état, tous ceux qui en dépendent en soient notifiés et soient mis à jour automatiquement.
Stratégie définit une famille d’algorithmes, encapsule chacun d’eux et les rend interchangeables. Il permet à l’algorithme de varier indépendamment des clients qui l’utilisent.
cysboy. Disponible ici (le 2014-11-18).Les diagrammes UML™ sont réalisés avec plantUML avec des conventions graphiques propres qui sont listées ci-dessous.
/